package com.yuanjin.util;

import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import android.R.integer;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.ThumbnailUtils;
import android.net.Uri;
import android.provider.MediaStore;

public class MediaUtils {
	public static int MyMedia_Image = 1;
	public static int MyMedia_Video = 2;

	/**
	 * 1、获取图片的缩略图
	 * 
	 * @1、先设置inJustDecodeBounds= true，调用decodeFile()得到图像的基本信息
	 * @2、利用图像的宽度（或者高度，或综合）以及目标的宽度，得到inSampleSize值
	 * @3、再设置inJustDecodeBounds= false，调用decodeFile()得到完整的图像数据
	 * @4、总结：先获取比例，再读入数据，如果欲读入大比例缩小的图，将显著的节约内容资源
	 * @param uri
	 * @param width
	 * @param height
	 */
	public static Bitmap getImageThumbnail(String uri, int width, int height) {
		Bitmap bitmap = null;
		BitmapFactory.Options options = new BitmapFactory.Options();
		// 为true则将不返回实际的bitmap对象，不给其分配内存空间，但是可以得到一些解码边界信息，即图片大小等信息
		// 如果设置为true，并不会把图像的数据完全解码.但是Options的outAbc中解出了图像的基本信息。
		// options.inJustDecodeBounds = true;
		// bitmap = BitmapFactory.decodeFile(uri, options);
		// 为了读到图片,必须把options.inJustDecodeBounds设回false
		// options.inJustDecodeBounds = false;
		int bewidth = options.outWidth / width;
		int beheight = options.outHeight / height;
		int be = 1;
		if (bewidth < beheight) {
			be = bewidth;
		} else {
			be = beheight;
		}
		if (be <= 0) {
			be = 1;
		}
		// be=4;
		// inSampleSize 设置decode时的缩放比例。
		options.inSampleSize = be;
		bitmap = BitmapFactory.decodeFile(uri, options);
		// 常量用于表示应该回收extractThumbnail(Bitmap, int, int,
		// int)输入源图片(第一个参数)，除非输出图片就是输入图片
		bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height,
				ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
		// /
		return bitmap;
	}

	/**
	 * 2、获取视频缩略图
	 * 
	 * @param uri
	 * @param width
	 * @param height
	 * @param kind
	 * @return
	 */
	public static Bitmap getVideoThumbnail(String uri, int width, int height,
			int kind) {
		Bitmap bitmap = null;
		bitmap = ThumbnailUtils.createVideoThumbnail(uri, kind);
		bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height,
				ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
		return bitmap;

	}

	/**
	 * 获取多媒体资源的缩略图 - 头像应用级别 - 200*200 一般大小在1-10kB 并保存到特定的路径
	 * 
	 * @param MyMedia
	 *            -MyMedia_Image=1:获取图片缩略图;MyMedia_Video=2：获取视频缩略图
	 * @param SavePath
	 *            ，缩略图保存地址
	 * @param SourcePath
	 *            ，原图地址
	 * @return
	 * @return
	 */
	public static Bitmap saveMediaThumbnail_small(int MyMedia,
			String SourcePath, String SavePath) {
		FileOutputStream b = null;
		Bitmap bitmap = null;
		try {
			b = new FileOutputStream(SavePath);
			switch (MyMedia) {
			case 1:// 图片文件资源
				bitmap = MediaUtils.getImageThumbnail(SourcePath.toString(),
						200, 200);
				break;

			case 2:// 视频文件资源
				bitmap = MediaUtils.getVideoThumbnail(SourcePath, 200, 200,
						MediaStore.Images.Thumbnails.MICRO_KIND);
				break;
			}
			bitmap.compress(Bitmap.CompressFormat.JPEG, 60, b);
			// //30 是压缩率，表示压缩70%; 如果不压缩是100，表示压缩率为0
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				b.flush();
				b.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}
		return bitmap;

	}

	/**
	 * 获取多媒体资源的压缩图并保存到特定的路径 - 图片大小在50k - 200k 之间
	 * 
	 * @param MyMedia
	 *            -MyMedia_Image=1:获取图片缩略图;MyMedia_Video=2：获取视频缩略图
	 * @param SavePath
	 *            ，缩略图保存地址
	 * @param SourcePath
	 *            ，原图地址
	 * @return
	 * @return
	 */
	public static Bitmap saveMediaThumbnail_normal(int MyMedia,
			String SourcePath, String SavePath) {
		// FileOutputStream b = null;
		Bitmap bitmap = null;
		BitmapFactory.Options options = new BitmapFactory.Options();
		options.inSampleSize = 4;

		// try {
		// b = new FileOutputStream(SavePath);
		// } catch (FileNotFoundException e1) {
		// // TODO Auto-generated catch block
		// e1.printStackTrace();
		// }
		ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
		switch (MyMedia) {
		case 1:// 图片文件资源
			bitmap = BitmapFactory.decodeFile(SourcePath, options);
			break;

		case 2:// 视频文件资源
			bitmap = MediaUtils.getVideoThumbnail(SourcePath, 200, 200,
					MediaStore.Images.Thumbnails.MICRO_KIND);

			// bitmap = ThumbnailUtils.createVideoThumbnail(uri, kind);
			// bitmap = ThumbnailUtils.extractThumbnail(bitmap, width,
			// height,
			// ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
			break;
		}
		// bitmap.compress(Bitmap.CompressFormat.JPEG, 90, b);
		bitmap.compress(Bitmap.CompressFormat.JPEG, 85, outputStream);

		try {
			outputStream.flush();
			outputStream.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		// //30 是压缩率，表示压缩70%; 如果不压缩是100，表示压缩率为0
		return bitmap;

	}

	/**
	 * 获得本地相册选中图片的绝对路径
	 * 
	 * @param context
	 * @param uri
	 * @return
	 */
	public static String getImageAbsolutePath(Context context, Uri uri) {
		// MediaStore.MediaColumns.DATA 字段存的就是图片的绝对路径
		String[] column = {};
		String path = "";
		Cursor cursor = context.getContentResolver().query(uri, column, null,
				null, null);
		if (cursor != null) {
			// 将光标移至开头
			cursor.moveToFirst();
			// 获得用户选择图片的索引值
			int column_index = cursor
					.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);

			// 根据索引值获得图片路径
			path = cursor.getString(column_index);
		}

		return path;
	}

}
